perm filename XWRD1.SAI[PUZ,HPM] blob sn#153528 filedate 1975-04-03 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00009 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "XWORD"
C00003 00003	   BEGIN
C00005 00004	   INIWRD(DICSIZ,WORDS[0]) TREE←0
C00006 00005	   IF TRUE THEN   comment display the dictionary
C00008 00006	   FOR L←1 STEP 1 UNTIL SIZE DO FOR M←1 STEP 1 UNTIL SIZE DO XWRD[L,M]←"A"
C00009 00007	      IF I MOD 2=0 THEN
C00013 00008	      ELSE
C00016 00009	      IF ¬FLUSH THEN
C00018 ENDMK
C⊗;
BEGIN "XWORD"
REQUIRE "DICWRD.SAI[PUZ,HPM]" SOURCE_FILE;
REQUIRE "DDSUB.SAI[GRA,HPM]" SOURCE_FILE;
INTEGER SIZE,I,J,K,L,M,N,O,CHN,DICSIZ,DICSTP,CNT,BRK,EOF,FLG;

OUTSTR("PUZZLE SIZE:"); SIZE←CVD(INCHWL);
OUTSTR("NO OF DICTIONARY WORDS:"); DICSIZ←CVD(INCHWL);
OUTSTR("DICTIONARY STEP SIZE:"); DICSTP←CVD(INCHWL);
OUTSTR("CHANNEL "&CVOS(CHN←GDDCHN(-1))&'15&'12);
DDINIT;
SCREEN(-1,-1,SIZE+1,SIZE+1);
DRKEN; RECTAN(-1000,-1000,1000,1000);
LITEN;
FOR K←0 STEP 1 UNTIL SIZE DO
   BEGIN
   LINE(0,K,SIZE,K);
   LINE(K,0,K,SIZE);
   END;
DPYUP(CHN);
SHOW(CHN);
   BEGIN
   INTEGER ARRAY XWRD[1:SIZE,1:SIZE];
   INTEGER ARRAY WORDS[0:DICSIZ];
   INTEGER TREE; STRING WRD;

   STRING PROCEDURE BUMP(STRING PLUMB);
      BEGIN
      BOOLEAN WINNAGE;

      comment  this bumps;
      WINNAGE←FALSE;
      WHILE LENGTH(PLUMB)>0 ∧ ¬WINNAGE DO
      IF PLUMB[∞ TO ∞]="Z" THEN PLUMB←PLUMB[1 TO ∞-1]
      ELSE
         BEGIN
         PLUMB←PLUMB[1 TO ∞-1]&(PLUMB[∞ TO ∞]+1);
         IF FINWRD(TREE,PLUMB,SIZE)≠0 THEN WINNAGE←TRUE;
         END;

      IF WINNAGE THEN
         BEGIN
         comment  this builds;
         WHILE LENGTH(PLUMB)<SIZE DO
            BEGIN
            PLUMB←PLUMB&"A";
            WHILE FINWRD(TREE,PLUMB,SIZE)=0 DO
               PLUMB←PLUMB[1 TO ∞-1]&(PLUMB[∞ TO ∞]+1);
            END;
          END;
      RETURN(PLUMB);
      END;
   INIWRD(DICSIZ,WORDS[0]); TREE←0;

   OPEN(1,"DSK",0,2,0,30,BRK,EOF);
   LOOKUP(1,"DICT",FLG);
   SETBREAK(1,'12," "&'15&'13&'14&"'","INS");
   
   DO FOR L←1 STEP 1 UNTIL DICSTP DO
      DO WRD←INPUT(1,1) UNTIL LENGTH(WRD)=SIZE ∨ EOF
   UNTIL EOF ∨ INSWRD(TREE,WRD)=0;

   CLOSE(1);
   IF TRUE THEN   comment display the dictionary;
      BEGIN
      STRING PLUMB;
      PLUMB←"";
      DO
         BEGIN
         BOOLEAN WINNAGE;

         comment  this builds;
         WHILE LENGTH(PLUMB)<SIZE DO
            BEGIN
            PLUMB←PLUMB&"A";
            WHILE FINWRD(TREE,PLUMB,SIZE)=0 DO
               PLUMB←PLUMB[1 TO ∞-1]&(PLUMB[∞ TO ∞]+1);
            END;

         OUTSTR(PLUMB&" ");

         comment  this bumps;
         WINNAGE←FALSE;
         WHILE LENGTH(PLUMB)>0 ∧ ¬WINNAGE DO
         IF PLUMB[∞ TO ∞]="Z" THEN PLUMB←PLUMB[1 TO ∞-1]
         ELSE
            BEGIN
            PLUMB←PLUMB[1 TO ∞-1]&(PLUMB[∞ TO ∞]+1);
            IF FINWRD(TREE,PLUMB,SIZE)≠0 THEN WINNAGE←TRUE;
            END;

         END
      UNTIL LENGTH(PLUMB)=0;
      END;
   FOR L←1 STEP 1 UNTIL SIZE DO FOR M←1 STEP 1 UNTIL SIZE DO XWRD[L,M]←"A";

   I←1;
   WHILE I≤2*SIZE∧I>0 DO
      BEGIN
      STRING KS;
      BOOLEAN FLUSH;
      J←(I+1)%2;
      IF I MOD 2=0 THEN
         BEGIN
         STRING PARTIAL;
         KS←"";
         FOR L←1 STEP 1 UNTIL SIZE DO KS←KS&XWRD[J,L];
         DO
            BEGIN
            KS←BUMP(KS);
            IF LENGTH(KS)≠0 THEN
               BEGIN
               FOR L←J+1 STEP 1 UNTIL SIZE DO XWRD[J,L]←KS[L TO L];
               L←J+1; FLUSH←FALSE;
               WHILE L≤SIZE ∧ ¬FLUSH DO
                  BEGIN
                  PARTIAL←"";
                  FOR M←1 STEP 1 UNTIL J DO PARTIAL←PARTIAL&XWRD[L,M];
                  FLUSH←(FINWRD(TREE,PARTIAL,SIZE)=0);
                  L←L+1;
                  END;
               END;
            END UNTIL LENGTH(KS)=0 ∨ ¬FLUSH;
         IF FLUSH THEN I←I-1 ELSE
            BEGIN
            I←I+1;
            IF J<SIZE THEN FOR L←J+1 STEP 1 UNTIL SIZE DO XWRD[L,J+1]←"A";
            END;
         END
      ELSE
         BEGIN
         STRING PARTIAL;
         KS←"";
         FOR L←1 STEP 1 UNTIL SIZE DO KS←KS&XWRD[L,J];
         DO
            BEGIN
            KS←BUMP(KS);
            IF LENGTH(KS)≠0 THEN
               BEGIN
               FOR L←J STEP 1 UNTIL SIZE DO XWRD[L,J]←KS[L TO L];
               L←J+1; FLUSH←FALSE;
               WHILE L≤SIZE ∧ ¬FLUSH DO
                  BEGIN
                  PARTIAL←"";
                  FOR M←1 STEP 1 UNTIL J DO PARTIAL←PARTIAL&XWRD[L,M];
                  FLUSH←(FINWRD(TREE,PARTIAL,SIZE)=0);
                  L←L+1;
                  END;
               END;
            END UNTIL LENGTH(KS)=0 ∨ ¬FLUSH;
         IF FLUSH THEN I←I-1 ELSE
            BEGIN
            I←I+1;
            IF J<SIZE THEN FOR L←J STEP 1 UNTIL SIZE DO XWRD[L,J+1]←"A";
            END;
         END;
      IF ¬FLUSH THEN
         BEGIN
         DRKEN; RECTAN(-1000,-1000,1000,1000);
         LITEN;

         FOR K←0 STEP 1 UNTIL SIZE DO
            BEGIN
            LINE(0,K,SIZE,K);
            LINE(K,0,K,SIZE);
            END;

         FOR K←1 STEP 1 UNTIL SIZE DO
         FOR L←1 STEP 1 UNTIL (I+1)%2 DO
            BEGIN
            TXTPOS(K-.7,SIZE-L+.3,.5,.5);
            TEXT(XWRD[K,L]);
            END;

         FOR K←1 STEP 1 UNTIL I%2 DO
         FOR L←1 STEP 1 UNTIL SIZE DO
            BEGIN
            TXTPOS(K-.7,SIZE-L+.3,.5,.5);
            TEXT(XWRD[K,L]);
            END;
        
         DPYUP(CHN);
         SHOW(CHN);

         END;
      END;
   END;
END;